package com.core.base.dao;

import java.util.List;

import com.core.base.searchForm.ISearchForm;
import com.core.base.searchForm.hql.IBaseHQLSearchForm;
import com.core.page.PagerResult;
import com.core.util.PageBean;


/**
 * DAO接口类
 * 
 * @author pt-chenqw
 *
 * @param <E>
 */
public interface BaseIDAO<E> {

	/**
	 * 持久化对象实体
	 * @param entity 对象实体
	 */
	public void save(E entity);

	/**
	 * 删除对象实体
	 * @param entity 对象实体
	 */
	public void delete(E entity);


	/**
	 * 根据给定的Detached对象标识符更新对象实体
	 * @param entity 对象实体
	 */
	public void update(E entity);


	/**
	 * 合并给定的对象实体状态到当前的持久化上下文
	 * @param entity 给定的对象实体
	 * @return 返回对象实体
	 */
	public E merge(E entity);

	/**
	 * 彻底清除会话
	 */
	public void clear();

	/**
	 * 从会话缓存中删除此对象实体
	 * @param entity 待删除的对象实体
	 */
	public void evict(E entity);
	
	/**
	 * HQL分页查询
	 * @param hql HQL语句
	 * @param pageNo 下一页
	 * @param pageSize 一页总条数
	 * @param values不定Object数组参数
	 * @return
	 */
	public PageBean<E> findPageByFetchedHql(String hql, int pageNo, int pageSize, Object... values);
	
	/**
	 * 统计所有的数据量
	 * @param hql
	 * @param values
	 * @return
	 */
	public Integer countByHql(String hql, Object... values);
	
	
	public Integer countByHql(String hql);
	
	/**
	 * 执行HQL
	 * @param hql
	 * @param values
	 * @return 执行语句更新的条数
	 */
	public int executeHQL(String hql,Object...values);
	
	/**
	 * 根据条件进行查询
	 * @param searchClass
	 * @param searchForm
	 * @return
	 */
	public PagerResult<E> findbyCondition(final Class<?> searchClass,final ISearchForm searchForm);

	/**
	 * 根据条件进行查询,基于HQL方式
	 * @param searchClass
	 * @param searchForm
	 * @return
	 */
	public PagerResult<E> findbyHQLCondition(final Class<?> searchClass,final IBaseHQLSearchForm searchForm);
	
	/**
	 * 批量删除
	 * @param entities
	 */
	public void deleteBatch(List<E> entities); 
	
	/***
	 * 根据HQL查询，返回object
	 * @param hql
	 * @param values
	 * @return
	 */
	public List<Object[]> findByHQL(String hql,Object[] values);
}
